Modern computer systems can have a wide range and a variety of configurations. One important component of a computer system is the processor, also referred to as the central processing unit (CPU). The processor executes instructions from a software program, a process referred to as “running” the program. Although typically all processors perform this basic task, a wide variety of different processing devices (e.g., graphics processors) are available from a number of different manufacturers. These different processing devices, especially those from different manufacturers, have different internal designs, also referred to as the processor “architecture”, and thus operate in different ways. Although the results from running a program on two different processing devices should be the same, the way in which the processing devices obtain the result, as well as its speed, typically differ.
The development of applications to be executed on heterogeneous processing devices remains a challenging task. Compilers may present a programming model with an executable format (e.g., fat binary) which however requires specific changes to the linker/loader to generate the code.